package br.com.lle.sata.mobile.core.robo;

import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import br.com.lle.sata.mobile.core.http.HTTPSata;
import br.com.lle.sata.mobile.core.interfaces.IBuscaCotacaoOpcao;
import br.com.lle.sata.mobile.core.to.CotacaoOpcaoTO;

public class BVMFBuscaCotacaoOpcao implements IBuscaCotacaoOpcao {
	
	private String URL_COTACAO_OPCAO = "http://www.bmfbovespa.com.br/opcoes/opcoes.aspx?Idioma=pt-br";
	
	private String TIPO_ACAO = "PN";

	@Override
	public List<CotacaoOpcaoTO> getCotacoesOpcoes(String codigoAtivo) {
		List<CotacaoOpcaoTO> opcoes = new ArrayList<CotacaoOpcaoTO>();
		String nomeEmpresa = "";

		if (codigoAtivo != null) {
			Hashtable h = new Hashtable();
//			h.put("__EVENTTARGET","ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$lnkLetraP");
			h.put("__EVENTARGUMENT","");
			h.put("__LASTFOCUS","");
//			h.put("__VIEWSTATE",SATAPropertyLoader.getProperty("viewState"));
			h.put("ctl00$ucTopo$btnBusca","Busca");
			h.put("ctl00$menuBOVESPASecundario","");
			h.put("ctl00$contentPlaceHolderConteudo$tabOpcoes","{\"State\":{},\"TabState\":{\"ctl00_contentPlaceHolderConteudo_tabOpcoes_tabPosicoesAberto\":{\"Selected\":true},\"ctl00_contentPlaceHolderConteudo_tabOpcoes_tabPosicoesAberto_tabOpcoesEmp\":{\"Selected\":true},\"ctl00_contentPlaceHolderConteudo_tabOpcoes_tabSeriesAutorizadas_tabSeriesAutEmp\":{\"Selected\":true}}}");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$", "rbTodos");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$cmbVcto","0");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$txtConsultaData$txtConsultaData","2015-05-08");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$txtConsultaData$txtConsultaData$dateInput","2015-05-08-00-00-00");
//			h.put("ctl00_contentPlaceHolderConteudo_posicoesAbertoEmp_txtConsultaData_txtConsultaData_calendar_SD","[]");
//			h.put("ctl00_contentPlaceHolderConteudo_posicoesAbertoEmp_txtConsultaData_txtConsultaData_calendar_AD","[[2015,3,12],[2015,5,8],[2015,5,8]]");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$txtConsultaEmpresa", nomeEmpresa);
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$txtConsultaDataDownload$txtConsultaDataDownload","2015-05-08");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$txtConsultaDataDownload$txtConsultaDataDownload$dateInput","2015-05-08-00-00-00");
//			h.put("ctl00_contentPlaceHolderConteudo_posicoesAbertoEmp_txtConsultaDataDownload_txtConsultaDataDownload_calendar_SD","[]");
//			h.put("ctl00_contentPlaceHolderConteudo_posicoesAbertoEmp_txtConsultaDataDownload_txtConsultaDataDownload_calendar_AD","[[2015,3,12],[2015,5,8],[2015,5,8]]");
			h.put("ctl00$contentPlaceHolderConteudo$mpgOpcoes_Selected","0");
			h.put("ctl00$contentPlaceHolderConteudo$posicoesAbertoEmp$btnBuscarEmpresa","buscar");

			String html = removeExcessoEspacos(HTTPSata.POST(URL_COTACAO_OPCAO, h));

			int corte = html.indexOf("de Compra</h2>");
			if (corte > -1) {
				html = html.substring(corte, html.indexOf("de Venda</h2>"));
				int corteSerie = html.indexOf(TIPO_ACAO);
				do {
					String htmlSerie = html.substring(corteSerie);
					String dataSerie = htmlSerie.substring(htmlSerie.indexOf("Vencimento:")+11, htmlSerie.indexOf("</a>")).trim();
					System.out.println("dataSerie="+dataSerie);
					htmlSerie = htmlSerie.substring(htmlSerie.indexOf("<td align=\"center\">"),htmlSerie.indexOf("</li>"));
					int corteOpcao = 0;
					do {
						String htmlOpcao = htmlSerie.substring(corteOpcao+19, htmlSerie.indexOf("</tr>", corteOpcao));
						String codOpcao = htmlOpcao.substring(0, htmlOpcao.indexOf("</td>")).trim();
						htmlOpcao = htmlOpcao.substring(htmlOpcao.indexOf("<td align=\"right\">"));
						BigDecimal precoExercicio = new BigDecimal(htmlOpcao.substring(18,htmlOpcao.indexOf("</td>")).trim().replace(",", "."));
						htmlOpcao = htmlOpcao.substring(htmlOpcao.indexOf("<td align=\"right\">",19));
						int coberto = Integer.parseInt(htmlOpcao.substring(18,htmlOpcao.indexOf("</td>")).trim().replace(".", ""));
						corteOpcao = htmlSerie.indexOf("<td align=\"center\">",corteOpcao+19);
						if (coberto != 0 && !codOpcao.contains(" E")) {
							CotacaoOpcaoTO opcao = new CotacaoOpcaoTO();
							opcao.setCodigo(codOpcao);
							opcao.setCodigoAcao(codigoAtivo);
							opcao.setPrecoExercicio(String.valueOf(precoExercicio));
							opcao.setDataVencimento(dataSerie);
							opcoes.add(opcao);
							System.out.println("codOpcao="+codOpcao+"; precoEx="+precoExercicio+"; coberto="+coberto);
						}
					} while(corteOpcao > -1);

					corteSerie = html.indexOf(TIPO_ACAO, corteSerie+2);
				} while (corteSerie > -1);
			}
		}
		System.out.println("Atualizando opcoes da " + nomeEmpresa + " ...");
		return opcoes;
	}
	
	public static String removeExcessoEspacos(String str) {
		String padrao = "\\s{2,}";
	    Pattern regPat = Pattern.compile(padrao);
	    Matcher matcher = regPat.matcher(str);
	    String res = matcher.replaceAll(" ").trim();
	    return res;
	}
	
	public static java.util.Date converteToDate(String data) throws ParseException {
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
		return (java.util.Date) formatter.parse(data); 
	}
	
}
